﻿#region Using

using System.Collections.Generic;
using System.Threading.Tasks;

#endregion

namespace Vk.Methods.Notifications
{
    /// <summary>
    ///     Уведомления
    /// </summary>
    public class Notifications
    {
        private readonly Api _api;

        public Notifications(Api api)
        {
            _api = api;
        }

        /// <summary>
        ///     Возвращает список оповещений об ответах других пользователей на записи текущего пользователя.
        /// </summary>
        /// <param name="filters">Перечисленные через запятую типы оповещений, которые необходимо получить.</param>
        /// <param name="startTime">
        ///     Время, в формате unixtime, начиная с которого следует получить оповещения для текущего
        ///     пользователя. Если параметр не задан, то он считается равным значению времени, которое было сутки назад.
        /// </param>
        /// <param name="endTime">
        ///     Время, в формате unixtime, до которого следует получить оповещения для текущего пользователя.
        ///     Если параметр не задан, то он считается равным текущему времени.
        /// </param>
        /// <param name="offset">Смещение, начиная с которого следует вернуть список оповещений.</param>
        /// <param name="count">
        ///     Указывает, какое максимальное число оповещений следует возвращать, но не более 100. По умолчанию
        ///     30.
        /// </param>
        /// <param name="startFrom">
        ///     Строковый идентификатор последнего полученного предыдущим вызовом метода оповещения (см. описание
        ///     поля new_from в результате)
        /// </param>
        public async Task<NotificationsClassified> Get(IEnumerable<NotificationFilterType> filters = null,
                                                       string startFrom = null,
                                                       int? startTime = null,
                                                       int? endTime = null,
                                                       int? offset = null,
                                                       int? count = null)
        {
            var query = new ApiQuery("notifications.get")
                .Add("filters", filters)
                .Add("start_from", startFrom)
                .Add("start_time", startTime)
                .Add("end_time", endTime)
                .Add("count", count)
                .Add("offset", offset);

            var result = await _api.Manager.Execute(query);

            return _api.Manager.MethodSuccessed ? new NotificationsClassified(result) : null;
        }

        /// <summary>
        ///     Сбрасывает счетчик непросмотренных оповещений об ответах других пользователей на записи текущего пользователя.
        /// </summary>
        /// <returns>
        ///     Если у пользователя присутствовали непросмотренные ответы, возвращает true в случае успешного завершения. В
        ///     противном случае возвращает false.
        /// </returns>
        public async Task<bool> MarkAsViewed()
        {
            var query = new ApiQuery("notifications.markAsViewed");
            var result = await _api.Manager.Execute(query);

            return _api.Manager.MethodSuccessed && result.Bool().Value;
        }
    }
}